// reduce 求和
// 未知参数个数
// 扩展运算符(…)用于取出参数对象中的所有可遍历属性，拷贝到当前对象之中
const sumFn = (...args) => {
  return args.reduce((a, b) => {
    return a + b
  })
};

// sort 排序
const sortFn = (...args) => {
  return args.sort((a, b) => a - b);
}


// 函数柯里化
var currying = function (func) {
  const args = [];
  return function result(...rest) {
    if (rest.length === 0) {
      return func(...args);
    } else {
      args.push(...rest);
      return result;
    }
  }
};


console.log(currying(sumFn)(1)(2)(3)());
console.log(currying(sumFn)(1, 2)(3, 4)(5)());
console.log(currying(sumFn)(1)(2, 3, 4, 5)(6)());

console.log(currying(sortFn)(1)(3)(2)(6, 4)(5)());
// 函数柯里化
// 柯里化也称部分求值，其含义是给函数分步传递参数，
// 每次传递参数进行处理，并返回一个更具体的函数接受剩下二点参数，
// 中间可以嵌套多层这样的接收部分参数函数，直至返回最后结果

// let add = (x, y) => {
//   return x + y
// }
// console.log(add(1, 2));

// let add2 = (x) => {
//   return (y) => {
//     return x + y
//   }
// }
// console.log(add2(1)(3));